import numpy
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 描述性统计
pd1 = pd.DataFrame(np.random.rand(4, 3), columns=['one', 'two', 'three'], index=['a', 'b', 'c', 'd'])
print(pd1)
print(pd1.mean(0))  # 0是列，1是行   方向上的平均值
print(pd1.sum(1, skipna=False))
"""
这段代码的功能是计算 pd1 对象每一行的总和，
并且在计算过程中不跳过任何 NaN 值
"""
ts_stand = (pd1 - pd1.mean()) / pd1.std()
# print(pd1)
# print(pd1.mean())
# print(pd1.std())
print(ts_stand)
print(ts_stand.std())

xs_stand = pd1.sub(pd1.mean(1), axis=0).div(pd1.std(1), axis=0)
"""
这段代码的功能是对 pd1 数据框的每一列进行标准化处理，："""
print(xs_stand)
print(pd1)
print(pd1.cumsum(1))  # 0  1

"""
count	统计非空值数量
sum	汇总值
mean	平均值
mad	平均绝对偏差
median	算数中位数
min	最小值
max	最大值
mode	众数
abs	绝对值
prod	乘积
std	贝塞尔校正的样本标准偏差
var	无偏方差
sem	平均值的标准误差
skew	样本偏度 (第三阶)
kurt	样本峰度 (第四阶)
quantile	样本分位数 (不同 % 的值)
cumsum	累加
cumprod	累乘
cummax	累积最大值
cummin	累积最小值
"""
# NumPy 的 mean、std、sum 等方法默认不统计 Series 里的空值。
pd1["one"] = [np.nan, 2, 3, 4]
print(np.mean(pd1["one"]))
print(np.mean(pd1['one'].to_numpy()))

series = pd.Series(np.random.randn(500))
series[20:100] = np.nan
print(series.nunique())  # 480 返回不同元素的数量

# 数据总结 describe
series2 = pd.Series(np.random.randn(1000))  # 正态分布的去取随机值
series2[::4] = np.nan
print(series2.describe())
"""
count：非空值的数量，这里是 750。
mean：平均值，这里是 -0.007933。
std：标准差，这里是 0.972292。
min：最小值，这里是 -2.716354。
25%：第一四分位数（下四分位数），这里是 -0.694946。
50%：中位数（第二四分位数），这里是 -0.025471。
75%：第三四分位数（上四分位数），这里是 0.652755。
max：最大值，这里是 2.895593。
"""
pd2 = pd.DataFrame(np.random.randn(100, 5), columns=list('abcde'))
print(pd2.describe())
"""
对于非数值型 Series 对象， describe() 返回值的总数、唯一值数量、出现次数最多的值及出现的次数。
"""

series3 = pd.Series(['a', 'b', 'c'])
print(series3.describe())
# series3.div(2)  除运算

pd3 = pd.DataFrame({'A': pd.Timestamp('20130101'),
                    'B': [1, 2, 3]})
print(pd3.describe(include='number'))  # include='number'
# 最大值与最小值对应的索引
print(pd1)
print(pd1.idxmax(axis=0),pd1.idxmin(axis=1))

#值计数（直方图）与众数
serie4=pd.Series(numpy.random.randint(1,5,50))
print(serie4)
print(serie4.value_counts())#值计数

print(serie4.mode())#众数

#离散化与分位数
np1=np.random.randn(20)
print(pd.cut(np1,3))
print(pd.qcut(np1,[0,.25,.50,.75,1]))

asdasd=pd.Series(np1).value_counts(pd.qcut(np1,[0,.25,.50,.75,1]))
print(asdasd)